package main

import "fmt"

// 接口的总结：
// 接口的实现，必须实现所有的方法才是实现
// go中的结构不需要显示的实现接口，没有impl关键字
// go中实现接口是基于方法的，不是基于接口的

//接口的注意事项
//接口之间可以继承

func main() {

	// 创建一个中国人
	c := Chinese{}
	//	 创建一个美国人
	a := American{}
	//  创建一个日本人
	j := Japanese{}

	//同一个函数，传入不同的结构体，表现不同的动作action
	greet(c)
	greet(a)
	greet(j)

	//	使用多台来创建对象 (多态)
	var p People = Chinese{}
	p.sayHello()
}

// People 接口：声明没有实现的方法
type People interface {
	sayHello()
}

// Chinese 接口的实现
type Chinese struct {
}

func (c Chinese) sayHello() {
	fmt.Println("你好")
}

// American 接口的实现
type American struct {
}

func (a American) sayHello() {
	fmt.Println("hello")
}

// Japanese 接口的实现
type Japanese struct {
}

func (a Japanese) sayHello() {
	fmt.Println("こんにちは")
}

// -------------------------
// 定义一个函数：专门用来桥接各个实现的函数，接受具备sayHello接口的能力的变量
func greet(p People) {
	// 直接调用接口里的方法
	p.sayHello()
}
